home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / asmcode.lbr / SCRNSAVE.AQM / SCRNSAVE.ASM
Assembly Source File  |  1985-06-03  |  8KB  |  267 lines

  1.      PAGE  ,132
  2. ;
  3. ;  Screen erase program - by Bob Murphy 9/16/84
  4. ;
  5. ;  This program will erase the display after the specified number of minutes.
  6. ;  Any Video I/O or Keyboard I/O will cause a restore of the display.
  7. ;
  8. ;
  9. ;  FORMAT:
  10. ;
  11. ;   SCRNSAVE [NN]
  12. ;
  13. ;   WHERE NN IS A 1 OR 2 DIGIT NUMBER OF MINUTES BETWEEN 1 AND 29.
  14. ;   THE DEFAULT VALUE IS 5 MINUTES.
  15. ;
  16. ;
  17. ;
  18.  
  19. ; DEFINE THE CODE SEGMENT, AND SET THINGS UP FOR A .COM PROGRAM
  20.  
  21. CSEG     SEGMENT PARA PUBLIC 'CODE'
  22.      ASSUME  CS:CSEG, DS:CSEG
  23.      ORG   100H
  24.  
  25. START:     JMP   INIT000           ;JUMP AROUND THE DATA AREA
  26. ;
  27. ;     EQUATES
  28. ;
  29. ADDR_6845    EQU    63H       ; CRT CONTROL PORT BASE ADDRESS
  30. CRT_MODE_SET    EQU    65H       ; CURRENT STATE OF CRT MODE REGISTER
  31. ;
  32. ;  MISC DATA FIELDS
  33. ;
  34. INITFLAG DB    0           ;USED TO DETERMINE IF WE SHOULD STAY RES
  35. SWFLAG     DB    0           ;VIDEO NOT SWITHCED OFF (1 IF WE DID)
  36. COUNT     DW    0           ;TIMER COUNT
  37. DELAY     DW    0           ;COUNT FOR TIME-OUT
  38. PGM_ID     DB    'SCRNSAVE'          ;THIS MUST BE AFTER CRTJMP!
  39. PGM_IDL  EQU   $-PGM_ID        ;COMPARE LENGTH
  40.      PAGE
  41. ;
  42. ; INTERRUPT VECTOR CONTROL BLOCKS. ALL 3 MUST BE IDENTICAL
  43. ;
  44. ;  TIMER TICK INTERRUPT TABLE
  45. ;
  46. TIMER     LABEL DWORD           ;ADDRESS OF REAL TIMER INT
  47. TIMEOFF  DW    0
  48. TIMESEG  DW    0
  49. TIMEADDR DW    TIMETICK        ;OFFSET OF NEW TIMER INTERRUPT
  50. TIMEINT  DB    1CH           ;TIMER INTERRUPT NUMBER
  51.      DB    0           ;SPARE
  52. INTBLK     EQU   $-TIMER           ;LENGTH OF AN INTERRUPT CONTROL BLOCK
  53.  
  54. ;
  55. ;  KEY STRIKE INTERRUPT TABLE
  56. ;
  57. KEY     LABEL DWORD           ;ADDRESS OF REAL KEYBOARD INT
  58.      DW    0
  59.      DW    0
  60.      DW    KEY_IN           ;OFFSET OF NEW KB INTERRUPT
  61.      DB    09H           ;KB INTERRUPT ADDRESS
  62.      DB    0           ;SPARE
  63.  
  64. ;
  65. ;  CRT OUTPUT INTERRUPT TABLE
  66. ;
  67. CRT     LABEL DWORD           ;ADDRESS OF REAL VIDEO INT (INT 10H)
  68.      DW    0
  69.      DW    0
  70.      DW    CRTOUT           ;OFFSET OF NEW TIMER INTERRUPT
  71.      DB    10H           ;VIDEO INTERRUPT NUMBER
  72.      DB    0           ;SPARE
  73.  
  74.      PAGE
  75. ;
  76. ;PROCESS THE 1CH INTERRUPT WHICH OCCURS 18.2 TIMES PER SECOND
  77. ;
  78. TIMETICK:
  79.      STI               ;RESTORE INTERRUPTS
  80.      PUSH  AX           ;SAVE SOME REGISTERS
  81.      PUSH  DS
  82.      MOV   AX,CS
  83.      MOV   DS,AX           ;SET THE DS REGISTER SAME AS CS
  84.      MOV   AX,COUNT
  85.      INC   AX
  86.      MOV   COUNT,AX        ;INCREMENT THE VALUE
  87.      CMP   AX,DELAY        ;UNTIL WE GET TO SELECTED DELAY
  88.                    ;THIS VALUE IS 444H PER MINUTE
  89.      JL    TIME800           ;LESS THAN DELAY TIME - SKIP TURN OFF
  90. ;
  91. ; SHUT OFF VIDEO OPERATION
  92. ;
  93.      PUSH  DX           ;SAVE THESE REGISTERS, TOO
  94.      PUSH  ES
  95.      MOV   AX,0040H        ;BIOS DATA AREA BASE
  96.      MOV   ES,AX
  97.      MOV   DX,ES:ADDR_6845       ;GET BASE ADDRESS OF THE VIDEO CONTROLLER
  98.      ADD   DX,4           ;POINT TO CONTROLLER'S MODE REGISTER
  99.      MOV   AL,ES:CRT_MODE_SET  ;GET CURRENT MODE SETTINGS
  100.      AND   AL,11110111B       ;CLEAR THE VIDEO ENABLE BIT TO
  101.      OUT   DX,AL           ;TURN OFF THE VIDEO.
  102.      POP   ES
  103.      POP   DX
  104.      MOV   SWFLAG,1        ;FLAG THAT WE HAVE SWITCHED OFF
  105. ;
  106. ; GO TO THE STANDARD TIMER INTERRUPT
  107. ;
  108. TIME800:
  109.      POP   DS           ;STANDARD EXIT. RESTORE USED REGISTERS
  110.      POP   AX           ;AND PROCESS WHATEVER WAS AT INT 1CH
  111.      PUSHF               ;BEFORE THIS PROGRAM CAME INTO ACTION.
  112.      CALL  CS:TIMER        ;PUSH DUMMY FLAGS, AND FAKE AN INT 1CH
  113.      IRET
  114.      PAGE
  115. ;
  116. ; THE USER HAS PRESSED A KEY...
  117. ;
  118. KEY_IN:
  119.      STI               ;RESTORE INTERRUPTS
  120.      CALL  CHKSCRN           ;IF SCREEN OFF - TURN IT BACK ON
  121.      PUSHF               ;DUMMY PUSH TO FAKE AN INT INSTRUCTION
  122.      CALL  CS:KEY           ;GO TO REAL KEYBOARD ROUTINE
  123.      IRET               ;AND RETURN TO WHAT WAS RUNNING BEFORE
  124. ;
  125. ;THE SYSTEM WANTS TO OUTPUT TO THE SCREEN...
  126. ;
  127. CRTOUT:
  128.      STI               ;RESTORE INTERRUPTS
  129.      CALL  CHKSCRN           ;IF CRT IS OFF-TURN IT BACK ON
  130.      PUSHF               ;FAKE AN INT 10H
  131.      CALL  CS:CRT           ;PROCESS THE VIDEO REQUEST
  132.      IRET               ;GO BACK TO CALLING PROGRAM
  133. ;
  134. ; A KEY HAS BEEN PRESSED OR CRT WRITE ATTEMPTED - TURN SCREEN BACK ON
  135. ;
  136. CHKSCRN  PROC  NEAR
  137.      CMP   CS:SWFLAG,0       ;HAVE WE SWITCHED THE VIDEO OFF?
  138.      JE    CHKS400           ;NO-SKIP
  139.      PUSH  AX           ;SAVE REGISTERS
  140.      PUSH  DS
  141.      PUSH  DX
  142.      PUSH  ES
  143.      MOV   AX,CS
  144.      MOV   DS,AX           ;SET THE DS REGISTER SAME AS CS
  145.      MOV   AX,0040H        ;FIRST, POINT TO THE ROM DATA AREA
  146.      MOV   ES,AX
  147.      MOV   DX,ES:ADDR_6845       ;GET BASE ADDRESS OF VIDEO CONTROLLER
  148.      ADD   DX,4           ;AND POINT TO CONTROLLER MODE REGISTER
  149.      MOV   AL,ES:CRT_MODE_SET  ;GET THE OLD MODE SETTINGS AND
  150.      OUT   DX,AL           ;RESTORE THEM.
  151.      MOV   SWFLAG,0        ;NOT SWITCHED OFF ANYMORE
  152.      POP   ES
  153.      POP   DX
  154.      POP   DS           ;RESTORE REGISTERS
  155.      POP   AX
  156. CHKS400:
  157.      MOV   CS:COUNT,0       ;RESET (AGAIN) COUNT TO 0
  158.      RET
  159. CHKSCRN  ENDP
  160. ;
  161. END_PR:                ;USED TO DETERMINE LENGTH OF PROGRAM
  162.      PAGE
  163. ERR1MSG  DB    'PARM MUST BE A NUMBER BETWEEN 1 AND 29',7,13,10,'$'
  164. GOODMSG  DB    13,10,'SCREEN SAVER INITIALIZED',13,10,'$'
  165. RESTMSG  DB    13,10,'SCREEN SAVER TIME RESET',13,10,'$'
  166. ;
  167. ; INITIALIZATION CODE - DOES NOT STAY RESIDENT
  168. ;
  169. INIT000: MOV   AX,5           ;DEFAULT TIME VALUE
  170.      MOV   SI,80H           ;SEE IF ANY INPUT DATA
  171.      MOV   CL,[SI]           ;GET CHARACTER COUNT
  172.      SUB   CH,CH
  173.      OR    CL,CL           ;ANYTHING INPUT?
  174.      JZ    INIT100           ;NO-USE DEFAULT 5 MINUTE DELAY
  175.      MOV   DL,10           ;MULTIPLY VALUE
  176.      SUB   AX,AX           ;VALUE ACCUMULATION REGISTER
  177.      SUB   BH,BH           ;HI SIDE OF PICKUP REG = 0 FOR ADD
  178. INIT020: INC   SI           ;POINT TO CHARACTER
  179.      MOV   BL,[SI]
  180.      CMP   BL,' '              ;BLANK?
  181.      JE    INIT040           ;YES-DISCARD IT
  182.      CMP   BL,'0'              ;CHK FOR DIGIT
  183.      JL    INIT900           ;INVALID - THEN ERR1
  184.      CMP   BL,'9'              ;SAME THING
  185.      JG    INIT900           ;FALL THRU ON A VALID DIGIT
  186.      SUB   BL,'0'              ;SET RANGE 0-9
  187.      MUL   DL
  188.      ADD   AX,BX           ;SUM DIGITS
  189.      CMP   AX,29           ;EXCEED MAX TIME OF 29 MINUTES?
  190.      JG    INIT900           ;YES-ERROR
  191. INIT040: LOOP  INIT020           ;DO NEXT DIGIT
  192.      OR    AX,AX           ;ZERO TIME?
  193.      JZ    INIT900           ;YES-INVALID TIME
  194.      PAGE
  195. ;
  196. ; AX CONTAINS A VALID TIME PERIOD  (0 < AX < 30). SEE IF PGM LOADED BEFORE
  197. ;
  198. ; CRT VECTOR SELECTED, BECAUSE ITS THE LEAST LIKELY TO BE MODIFIED BY A
  199. ; SUBSEQUENT PROGRAM. (WHO WOULD WANT TO TRAP THE VIDEO ROUTINE?)
  200. ;
  201. INIT100: PUSH  AX
  202.      MOV   AH,35H           ;GET VECTOR COMMAND
  203.      MOV   AL,10H           ;FOR CRT
  204.      INT   21H           ;POINT TO CRT VECTOR W/ES:BX
  205. ;                   ;IF PGM LOADED BEFORE, ES IS THE BASE
  206.      MOV   CX,PGM_IDL       ;COMPARE LENGTH
  207.      MOV   SI,OFFSET PGM_ID    ;POINT TO THIS PROGRAM ID
  208.      MOV   DI,SI
  209. REP     CMPSB               ;SEE IF PROGRAM ID MATCH OCCURS
  210.      JNE   INIT200           ;IF DIFFERENT, WE WANT TO STAY RESIDENT
  211.      MOV   INITFLAG,1       ;SET DONT STAY RESIDENT
  212.      PUSH  ES           ;ES HAS BASE OF RESIDENT VERSION
  213.      POP   DS           ;USE DELAY FIELD IN RESIDENT COPY
  214.  
  215. INIT200: POP   AX           ;RESTORE TIME COUNT
  216.      MOV   BX,444H           ;TICKS PER MINUTE
  217.      MUL   BX           ;CONVERT MINUTES TO TICKS
  218.      MOV   DELAY,AX        ;SAVE DELAY TIME PERIOD
  219.      PUSH  CS
  220.      POP   DS           ;SEE THAT WERE USING OUR OWN PROGRAM
  221.  
  222.      CMP   INITFLAG,0       ;ARE WE GOING TO STAY RESIDENT?
  223.      JNZ   INIT940           ;NO-THEN VECTORS ALREADY SET
  224.      PAGE
  225. ;
  226. ;  INITIALIZE TIMER, KEYBOARD, AND CRT VECTORS
  227. ;
  228.      SUB   SI,SI           ;START INITIALIZATION WITH TIMER INT
  229.      MOV   CX,3           ; 3 INTS TO INITIALIZE
  230.      SUB   AX,AX
  231.      MOV   ES,AX           ;ADDRESS LOW CORE
  232. INIT400: CALL  SETVEC           ;INITIALIZE 1 INTERRUPT VECTOR
  233.      ADD   SI,INTBLK       ;INDEX TO NEXT BLOCK
  234.      LOOP  INIT400           ;DO ALL 3
  235.      MOV   DX,OFFSET GOODMSG
  236.      MOV   AH,9
  237.      INT   21H           ;SEND MESSAGE
  238.      MOV   DX,OFFSET END_PR    ;POINT TO END OF RESIDENT CODE
  239.      INT   27H           ;TERM & STAY RESIDENT
  240. ;
  241. ;
  242. INIT900: MOV   DX,OFFSET ERR1MSG   ;ERROR IN PARAMETER
  243.      JMP   INIT980
  244. INIT940: MOV   DX,OFFSET RESTMSG   ;PGM RESIDENT ALREADY-TIME RESET
  245.      JMP   INIT980
  246. INIT980: MOV   AH,9
  247.      INT   21H           ;SEND MESSAGE
  248.      INT   20H           ;ABORT
  249. ;
  250. ;  SET UP AN INTERRUPT VECTOR FROM VECTOR ASSIGNMENT TABLE
  251. ;
  252. SETVEC     PROC  NEAR
  253.      MOV   AL,TIMEINT [SI]       ;GET INTERRUPT ADDRESS TO MODIFY
  254.      MOV   AH,35H           ;GET GET VECTOR DOS CALL
  255.      INT   21H           ;RETURN VECTOR IN ES:BX
  256.      MOV   TIMEOFF [SI],BX       ;SAVE ORIGINAL VECTOR OFFSET
  257.      MOV   BX,ES           ;GET SEGMENT
  258.      MOV   TIMESEG [SI],BX       ;SAVE ORIGINAL VECTOR SEGMENT
  259.      MOV   DX,TIMEADDR [SI]    ;GET REPLACEMENT INTERRUPT VECTOR OFFSET
  260.      MOV   AH,25H           ;SET UP NEW VECTOR FOR TIMER ETC
  261.      INT   21H           ;HAVE DOS DO THIS FOR US
  262.      RET               ;ALL DONE WITH THIS VECTOR
  263. SETVEC     ENDP
  264.  
  265. CSEG    ENDS
  266.     END    START
  267.